﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Data.SqlClient;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using System.Data.SqlTypes;
using System.Data;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;


namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAODocumentoPropuesta : DAOSQLServer, iDAODocumentoPropuesta
    {
        #region Atributos

        Conexion enlace = new Conexion(); 

        #endregion Atributos


        #region Eliminar Propuesta
        /// <summary>
        /// Metodo que elimina la propuesta de un proyecto
        /// </summary>
        /// <param name="idPropuesta">Id de la propuesta a eliminar</param>
        /// <returns>True si se elimina, false si no</returns>
        public bool EliminarPropuesta(int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
           
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[EliminarPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idProyecto", idProyecto);

                reader = command.ExecuteReader();
                return true;
               
            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Eliminar Propuesta

        #region Insertar Propuesta
        /// <summary>
        /// Metodo que agrega una propuesta al proyecto
        /// </summary>
        /// <param name="propuesta">Propuesta a agregar</param>
        /// <param name="idProyecto">Id del proyecto actual</param>
        /// <returns>True si fue agregada, false si no</returns>
        public bool InsertarPropuesta(Entidad propuesta, int idProyecto)
        {
            
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarPropuesta]";
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                command.Parameters.Add(new SqlParameter("@contenidoPropuesta", SqlDbType.Xml)
                {
                    Value = new SqlXml(new XmlTextReader((propuesta as Propuesta).Contenido.InnerXml
                        , XmlNodeType.Document, null))
                });
                
                

                reader= command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        } 
        #endregion Insertar Propuesta 

        #region Consultar Detalle Propuesta 
        /// <summary>
        /// Trae la infiormacion de la propuesta que se desa consultar
        /// </summary>
        /// <param name="idPropuesta">Id de la propuesta a consultar</param>
        /// <returns></returns>
        public Propuesta ConsultarDetallePropuesta(int idPropuesta)
        {
            Propuesta _propuesta = null;
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarDetallePropuesta]";
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idPropuesta", idPropuesta);

                reader = command.ExecuteReader();

                 if (reader.Read())
                 {
                     string xml = reader.GetSqlXml(0).Value;
                     XmlDocument doc = new XmlDocument();
                     doc.LoadXml(xml);
                     _propuesta = FabricaEntidad.NuevaPropuesta() as Propuesta;
                     _propuesta.Contenido=doc;
                 }

                 return _propuesta;
            }
            catch (SqlException)
            {
                return _propuesta;
            }

            catch (Exception)
            {
                return _propuesta;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        } 
        #endregion Consultar Detalle Propuesta

        #region Consultar Propuesta Por Proyecto
        /// <summary>
        /// Devuelve la propuesta asociada al proyecto actual
        /// </summary>
        /// <param name="idProyecto">Id del proyecto actual</param>
        /// <returns>La propuesta asociada</returns>
        public Propuesta ConsultarPropuesta(int idProyecto)
        {
            Propuesta _propuesta = null;
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarPropuesta]";
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idProyecto", idProyecto);

                reader = command.ExecuteReader();

                if (reader.Read())
                {
                    string xml = reader.GetSqlXml(1).Value;
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(xml);
                    _propuesta = FabricaEntidad.NuevaPropuesta() as Propuesta;
                    _propuesta.Contenido=doc;
                    _propuesta.Id = Convert.ToInt32(reader.GetDecimal(0));
                    
                }

                return _propuesta;
               
                
            }
            catch (SqlException)
            {
                return _propuesta;
            }

            catch (Exception)
            {
                return _propuesta;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        } 
        #endregion Consultar Propuesta Por Proyecto

        #region Verificar si el Proyecto tiene Propuesta
        /// <summary>
        /// Metodo que verifica si el proyecto tiene una propuesta ya creada
        /// </summary>
        /// <param name="idProyecto">Id del proyecto</param>
        /// <returns>True si tiene, False si no</returns>
        public bool VerificarPropuesta(int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarPropuesta]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                

                reader = command.ExecuteReader();

                if (reader.HasRows == false)
                    return false;
                else
                    return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                //Cerrar la conexion ocurran o no excepciones
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        } 
        #endregion Verificar si el Proyecto tiene Propuesta 

        #region Modificar Propuesta
        /// <summary>
        /// Metodo que modifica una propuesta
        /// </summary>
        /// <param name="propuesta">Propuesta con data actualizada</param>
        /// <param name="idPropuestaAnterior">Id de la propuesta a modificar</param>
        /// <returns>True, False</returns>
        public bool ModificarPropuesta(Entidad propuesta, int idProyecto)
        {

            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarPropuesta]";
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado

                //Entrada
                command.Parameters.AddWithValue("@idPropuesta", idProyecto);
                command.Parameters.Add(new SqlParameter("@contenidoPropuesta", SqlDbType.Xml)
                {
                    Value = new SqlXml(new XmlTextReader((propuesta as Propuesta).Contenido.InnerXml
                        , XmlNodeType.Document, null))
                });

                reader = command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }

            catch (Exception)
            {
                return false;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
        #endregion Modificar Propuesta


    }
}